package net.gd.utils;

import java.io.UnsupportedEncodingException;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

/**
 * 校验类
 */
public class CheckUtils {

	/**
	 * 正则表达式样式
	 */
	private static Map regexPatterns=new Hashtable();
	
	/**
	 * 获取正则表达式样式
	 * 目的：将已使用过的正则表达式样式保存起来，实现反复利用
	 * @param regex 正则表达式
	 * @return 正则表达式样式
	 */
	private static Pattern getRegexPattern(String regex){
		if(!regexPatterns.containsKey(regex)){
			Pattern p = Pattern.compile(regex);
			regexPatterns.put(regex, p);
		}
		return (Pattern)regexPatterns.get(regex); 
	}
	
	/**
	 * 是否能匹配正则表达式
	 * @param text 需匹配文本
	 * @param regex 正则表达式
	 * @return true:能够匹配 false：不能匹配
	 */
	public static boolean hasMatched(String text,String regex){
		Pattern p = getRegexPattern(regex);
		return p.matcher(text).matches();
	}
	
    /**
     * 判断是否为空
     * @param obj 
     * @return true:为空 false：不为空
     */
    public static boolean isEmpty(Object obj) {
        if (obj instanceof String) {
            return obj == null || ((String) obj).length() == 0;
        } else if (obj instanceof CharSequence) {
        	return obj == null || ((CharSequence) obj).length() == 0;
        } else if (obj instanceof Object[]) {
            Object[] temp = (Object[]) obj;
            for (int i = 0; i < temp.length; i++) {
                if (!isEmpty(temp[i])) {
                    return false;
                }
            }
            return true;
        } else if (obj instanceof List) {
        	return obj == null || ((List) obj).isEmpty();
        }
        	
        return obj == null;
	}
    
    /**
     * 判断是否是邮箱
     * @param text
     * @return
     */
    public static boolean isMail(String text) {
    	return text.matches("^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$");
	}
    
    /**
     * 判断是否是数字（0-9）
     * @param text
     * @return
     */
    public static boolean isDigits(String text) {
    	return text.matches("^\\d+$");
	}
    
    /**
     * 判断是否是数字，最大整数位8位，最大小数位2位
     * @param text
     * @return
     */
    public static boolean isNumber(String text) {
    	return text.matches("^(?:\\d{0,8})(?:\\.\\d{0,2})?$");
	}
    
    public static void main(String[] args){
    	System.out.println(isNumber("12345678.18"));
    }
    
    /**  
     * 判断是否是一个中文汉字  
     *   
     * @param c  
     *            字符  
     * @return true表示是中文汉字，false表示是英文字母  
     * @throws UnsupportedEncodingException 
     * @throws UnsupportedEncodingException  
     *             使用了JAVA不支持的编码格式  
     */  
    public static boolean isChineseChar(char c) throws UnsupportedEncodingException {   
        // 如果字节数大于1，是汉字   
        // 以这种方式区别英文字母和中文汉字并不是十分严谨，但在这个题目中，这样判断已经足够了   
        return String.valueOf(c).getBytes().length > 1;   
    }  
    
}
